from cmath import inf
import numpy as np
n=100000;
x1=20+10*np.random.rand(n,1)#关于这个范围其实是需要事先人为手动确定的
x2=x1-10
x3=-10+26*np.random.rand(n,1)
fmax=-inf
for i in range(0,n):
    x = [x1[i],x2[i],x3[i]];
    if (-x[0]+2*x[1]+2*x[2]>=0) & (x[0]+2*x[1]+2*x[2]<=72):#这里的条件是用于判断对应的数组是否符合约束条件
        result = x[0]*x[1]*x[2];#对所有符合要求的数组均进行一次数据更新和比较
        if result > fmax:
            fmax = result;
            X = x;#X是结果矩阵，用于储存上一次最大值对应的答案
print('初始范围模拟求得的最大值为：',fmax)
print('对应此处的x1,x2,x3取值为：',X)
#显然这种方法的初始范围较为分散，因此接下来我们通常需要更新一下范围再搜索一次
#基本方法都是一样的，只不过改一改x1,x2,x3的范围就够了
x1=22+np.random.rand(n,1)#从第一次模拟的结果得到的最小值的范围是，x1:22-23;x2:12-13;x3:12-13
x2=x1-10
x3=11.8+0.5*np.random.rand(n,1)
fmax=-inf
#重新搜索
for i in range(0,n):
    x = [x1[i],x2[i],x3[i]];
    if (-x[0]+2*x[1]+2*x[2]>=0) & (x[0]+2*x[1]+2*x[2]<=72):
        result = x[0]*x[1]*x[2];
        if result > fmax:
            fmax = result;
            X_0 = x;
print('缩小范围后模拟求得的最大值为：',fmax)
print('对应此处的x1,x2,x3取值为：',X_0)

